/*
 * Arbol.h
 *
 *  Created on: 01/11/2009
 *      Author: julfc
 */

#ifndef ARBOL_H_
#define ARBOL_H_

#include <iostream>
#include <fstream>
#include <list>
#include <string.h>
#include <stdexcept>
#include <stdio.h>

#include "Referencia.h"
#include "Nodo.h"
#include "RegistroArbol.h"

class Arbol {

public:
	short NODO_RAIZ;
	short NODO_HOJA;
	short NODO_INDICE;
	int COMIENZO_RAIZ;
	int CANT_CLAVES_INDICE_MAX;
	int CANT_PUNTEROS_MAX;
	int CANT_REGISTROS_MAX;
	int LONG_REGISTROS;
	int LONG_PUNTERO;
	int TAM_NODO_HOJA;
	int TAM_NODO_INDICE;
	int TAM_NODO_RAIZ;
	char HIJO_IZQ;
	char HIJO_DER;
	// Longitud maxima de las palabras
	int LONG_CLAVE;

	Arbol();

	void Crear(char* filePathName) throw (exception);

	void Abrir(char* filePathName) throw (exception);

	void Cerrar() throw (exception);

	void InsertarRegistro(string* clave, RegistroArbol* registro) throw (exception);

	bool ModificarRegistro(string* clave, RegistroArbol* registro) throw (exception);

	RegistroArbol* ObtenerRegistro(string* clave) throw (exception);

	void Imprimir(int offset);

	list<string> RecorrerOrdenado();

	virtual ~Arbol();

private:
	fstream* file;
	Nodo raiz;
	int CantNodosIndice;
	int CantNodosHojas;
	int UltimoBloque;

	int ObtenerProximoBloqueLibre();

	void AgregarClaveOrdenada(Nodo* nodo, string* clave, RegistroArbol* registro);

	string* CompletarClave(string* clave);

	Nodo* CrearHijo(Nodo* padre, char lado);

	bool BuscarInterno(Nodo* nodo, string* clave, Referencia* puntero, RegistroArbol* registro);

	int BuscarSiguiente(Nodo* nodo, string* clave);

	void Promover(list<Referencia>* camino, Referencia* puntHijoNuevo, string* clave) throw (exception);
};

#endif /* ARBOL_H_ */
